#include <iostream>
#include <coroutine>
#include <string>
#include <memory>

int count = 0; // 协程之间共享的全局变量

// 协程的任务
struct Task {
    struct promise_type {
        Task get_return_object() { return Task{std::coroutine_handle<promise_type>::from_promise(*this)}; }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() { std::terminate(); }
    };

    std::coroutine_handle<promise_type> handle;

    Task(std::coroutine_handle<promise_type> h) : handle(h) {}
    ~Task() {
        if (handle) handle.destroy();
    }

    void resume() {
        if (!handle.done()) {
            handle.resume();
        }
    }
};

Task entry(const std::string& name) {
    for (int i = 0; i < 10; i++) {
        count++;
        std::cout << name << "[" << count << "] ";
        co_await std::suspend_always{}; // 挂起协程
    }
}

int main() {

    std::string s("a");
    std::string s2("b");
    std::string s3("c");
    auto co1 = entry(s); // 创建协程1
    auto co2 = entry(s2); // 创建协程2
    auto co3 = entry(s3);

    // 交替运行两个协程
    while (true) {
        co1.resume(); // 恢复协程1
        co2.resume(); // 恢复协程2
        co3.resume(); 

        if (co1.handle.done() && co2.handle.done()&& co3.handle.done()) {
            break; // 两个协程都运行完毕
        }
    }

    std::cout << "Done" << std::endl;
    return 0;
}
